package org.gap.service;

import java.util.Calendar;
import java.util.List;
import java.util.Set;

import org.gap.dao.TiersDAO;
import org.gap.dao.TiersModifDAO;
import org.gap.dao.UtilisateursDAO;

import org.gap.domain.Tiers;
import org.gap.domain.TiersModif;
import org.gap.domain.Utilisateurs;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Transactional;

/**
 * Spring service that handles CRUD requests for TiersModif entities
 * 
 */

@Service("TiersModifService")
@Transactional
public class TiersModifServiceImpl implements TiersModifService {

	/**
	 * DAO injected by Spring that manages Tiers entities
	 * 
	 */
	@Autowired
	private TiersDAO tiersDAO;

	/**
	 * DAO injected by Spring that manages TiersModif entities
	 * 
	 */
	@Autowired
	private TiersModifDAO tiersModifDAO;

	/**
	 * DAO injected by Spring that manages Utilisateurs entities
	 * 
	 */
	@Autowired
	private UtilisateursDAO utilisateursDAO;

	/**
	 * Instantiates a new TiersModifServiceImpl.
	 *
	 */
	public TiersModifServiceImpl() {
	}

	/**
	 * Save an existing TiersModif entity
	 * 
	 */
	@Transactional
	public void saveTiersModif(TiersModif tiersmodif) {
		TiersModif existingTiersModif = tiersModifDAO.findTiersModifByPrimaryKey(tiersmodif.getTmoTiers(), tiersmodif.getTmoNomChampModif(), tiersmodif.getTmoDateModification());

		if (existingTiersModif != null) {
			if (existingTiersModif != tiersmodif) {
				existingTiersModif.setTmoTiers(tiersmodif.getTmoTiers());
				existingTiersModif.setTmoNomChampModif(tiersmodif.getTmoNomChampModif());
				existingTiersModif.setTmoDateModification(tiersmodif.getTmoDateModification());
				existingTiersModif.setTmoAncienneVal(tiersmodif.getTmoAncienneVal());
				existingTiersModif.setTmoNouvelleVal(tiersmodif.getTmoNouvelleVal());
			}
			tiersmodif = tiersModifDAO.store(existingTiersModif);
		} else {
			tiersmodif = tiersModifDAO.store(tiersmodif);
		}
		tiersModifDAO.flush();
	}

	/**
	 * Save an existing Tiers entity
	 * 
	 */
	@Transactional
	public TiersModif saveTiersModifTiers(Integer tmoTiers, String tmoNomChampModif, Calendar tmoDateModification, Tiers related_tiers) {
		TiersModif tiersmodif = tiersModifDAO.findTiersModifByPrimaryKey(tmoTiers, tmoNomChampModif, tmoDateModification, -1, -1);
		Tiers existingtiers = tiersDAO.findTiersByPrimaryKey(related_tiers.getTieTiers());

		// copy into the existing record to preserve existing relationships
		if (existingtiers != null) {
			existingtiers.setTieTiers(related_tiers.getTieTiers());
			existingtiers.setTieIdentClient(related_tiers.getTieIdentClient());
			existingtiers.setTieTypeTiers(related_tiers.getTieTypeTiers());
			existingtiers.setTieLibExterne(related_tiers.getTieLibExterne());
			existingtiers.setTieNationalite(related_tiers.getTieNationalite());
			existingtiers.setTieTelFix(related_tiers.getTieTelFix());
			existingtiers.setTieTelBureau(related_tiers.getTieTelBureau());
			existingtiers.setTieTelPortable(related_tiers.getTieTelPortable());
			existingtiers.setTieFax(related_tiers.getTieFax());
			existingtiers.setTieEMail(related_tiers.getTieEMail());
			existingtiers.setTieDateCreation(related_tiers.getTieDateCreation());
			existingtiers.setTieUserCreation(related_tiers.getTieUserCreation());
			related_tiers = existingtiers;
		}

		tiersmodif.setTiers(related_tiers);
		related_tiers.getTiersModifs().add(tiersmodif);
		tiersmodif = tiersModifDAO.store(tiersmodif);
		tiersModifDAO.flush();

		related_tiers = tiersDAO.store(related_tiers);
		tiersDAO.flush();

		return tiersmodif;
	}

	/**
	 * Save an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public TiersModif saveTiersModifUtilisateurs(Integer tmoTiers, String tmoNomChampModif, Calendar tmoDateModification, Utilisateurs related_utilisateurs) {
		TiersModif tiersmodif = tiersModifDAO.findTiersModifByPrimaryKey(tmoTiers, tmoNomChampModif, tmoDateModification, -1, -1);
		Utilisateurs existingutilisateurs = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateurs.getUsrUser());

		// copy into the existing record to preserve existing relationships
		if (existingutilisateurs != null) {
			existingutilisateurs.setUsrUser(related_utilisateurs.getUsrUser());
			existingutilisateurs.setUsrPassword(related_utilisateurs.getUsrPassword());
			existingutilisateurs.setUsrService(related_utilisateurs.getUsrService());
			existingutilisateurs.setUsrMail(related_utilisateurs.getUsrMail());
			existingutilisateurs.setUsrEnabled(related_utilisateurs.getUsrEnabled());
			related_utilisateurs = existingutilisateurs;
		}

		tiersmodif.setUtilisateurs(related_utilisateurs);
		related_utilisateurs.getTiersModifs().add(tiersmodif);
		tiersmodif = tiersModifDAO.store(tiersmodif);
		tiersModifDAO.flush();

		related_utilisateurs = utilisateursDAO.store(related_utilisateurs);
		utilisateursDAO.flush();

		return tiersmodif;
	}

	/**
	 * Delete an existing Tiers entity
	 * 
	 */
	@Transactional
	public TiersModif deleteTiersModifTiers(Integer tiersmodif_tmoTiers, String tiersmodif_tmoNomChampModif, Calendar tiersmodif_tmoDateModification, Integer related_tiers_tieTiers) {
		TiersModif tiersmodif = tiersModifDAO.findTiersModifByPrimaryKey(tiersmodif_tmoTiers, tiersmodif_tmoNomChampModif, tiersmodif_tmoDateModification, -1, -1);
		Tiers related_tiers = tiersDAO.findTiersByPrimaryKey(related_tiers_tieTiers, -1, -1);

		tiersmodif.setTiers(null);
		related_tiers.getTiersModifs().remove(tiersmodif);
		tiersmodif = tiersModifDAO.store(tiersmodif);
		tiersModifDAO.flush();

		related_tiers = tiersDAO.store(related_tiers);
		tiersDAO.flush();

		tiersDAO.remove(related_tiers);
		tiersDAO.flush();

		return tiersmodif;
	}

	/**
	 * Return all TiersModif entity
	 * 
	 */
	@Transactional
	public List<TiersModif> findAllTiersModifs(Integer startResult, Integer maxRows) {
		return new java.util.ArrayList<TiersModif>(tiersModifDAO.findAllTiersModifs(startResult, maxRows));
	}

	/**
	 * Load an existing TiersModif entity
	 * 
	 */
	@Transactional
	public Set<TiersModif> loadTiersModifs() {
		return tiersModifDAO.findAllTiersModifs();
	}

	/**
	 * Delete an existing TiersModif entity
	 * 
	 */
	@Transactional
	public void deleteTiersModif(TiersModif tiersmodif) {
		tiersModifDAO.remove(tiersmodif);
		tiersModifDAO.flush();
	}

	/**
	 * Delete an existing Utilisateurs entity
	 * 
	 */
	@Transactional
	public TiersModif deleteTiersModifUtilisateurs(Integer tiersmodif_tmoTiers, String tiersmodif_tmoNomChampModif, Calendar tiersmodif_tmoDateModification, String related_utilisateurs_usrUser) {
		TiersModif tiersmodif = tiersModifDAO.findTiersModifByPrimaryKey(tiersmodif_tmoTiers, tiersmodif_tmoNomChampModif, tiersmodif_tmoDateModification, -1, -1);
		Utilisateurs related_utilisateurs = utilisateursDAO.findUtilisateursByPrimaryKey(related_utilisateurs_usrUser, -1, -1);

		tiersmodif.setUtilisateurs(null);
		related_utilisateurs.getTiersModifs().remove(tiersmodif);
		tiersmodif = tiersModifDAO.store(tiersmodif);
		tiersModifDAO.flush();

		related_utilisateurs = utilisateursDAO.store(related_utilisateurs);
		utilisateursDAO.flush();

		utilisateursDAO.remove(related_utilisateurs);
		utilisateursDAO.flush();

		return tiersmodif;
	}

	/**
	 * Return a count of all TiersModif entity
	 * 
	 */
	@Transactional
	public Integer countTiersModifs() {
		return ((Long) tiersModifDAO.createQuerySingleResult("select count(*) from TiersModif o").getSingleResult()).intValue();
	}

	/**
	 */
	@Transactional
	public TiersModif findTiersModifByPrimaryKey(Integer tmoTiers, String tmoNomChampModif, Calendar tmoDateModification) {
		return tiersModifDAO.findTiersModifByPrimaryKey(tmoTiers, tmoNomChampModif, tmoDateModification);
	}
}
